package main

import "fmt"

//函数作业1 求n的阶乘
//循环版
func jc(n int) int {
	result := 1
	for i := 1; i <= n; i++ {
		result *= i
	}
	return result
}

//func main() {
//	n := 5
//	result := jc(n)
//	fmt.Printf("%d 的阶乘是 %d\n", n, result)
//}

//递归公式
func jc1(n int) int {
	if n <= 0 {
		return 1
	}
	return n * jc1(n-1)
}

//func main() {
//	n := 6
//	result := jc1(n)
//	fmt.Printf("%d 的阶乘是 %d\n", n, result)
//}

//使用递归和计数器
func jc3(n, counter int) int { //定义两个形参n阶乘的整数 counter积累计算结果的变量
	if n <= 1 {
		return counter
	}
	return jc3(n-1, counter*n)
}

//func main() {
//	n := 5 // 要计算的阶乘
//	result := jc3(n, 1)    //counter初值为1 每做一次判断得到的值都被赋值到counter上 直至n<=1
//	fmt.Printf("%d 的阶乘是 %d\n", n, result)
//}

//作业2 编写一个函数，接受一个参数n,n为正整数。要求数字必须整齐
func printNumbertriger(n int) {
	if n <= 0 {
		return
	}
	for i := 1; i <= n; i++ {
		// 打印空格，创建上三角空白部分
		for j := 1; j <= n-i; j++ {
			fmt.Print(" ")
		}

		// 打印数字，创建下三角数字部分（从大到小）
		for k := i; k >= 1; k-- {
			fmt.Print(k)
		}
		fmt.Println()
	}
}

func main() {
	n := 5 // 此处可以更改 n 的值
	printNumbertriger(n)
}

//作业3 简述defer作用和应用
//defer 是 Go 语言中的一个关键字，它用于延迟（defer）函数的执行直到包含它的函数执行完毕。defer 主要用于清理操作、资源释放和错误处理，具有以下作用和应用：

//资源释放和清理操作：defer 最常见的用途是在函数结束前执行一些资源释放或清理操作，例如关闭文件、释放锁、关闭数据库连接等。这可以确保在函数结束时执行必要的清理工作，无论函数是正常结束还是由于发生错误而提前返回。

//错误处理：defer 经常用于处理错误，尤其是在涉及到打开和关闭资源（如文件）时，可以通过 defer 在发生错误时确保资源被释放。这可以降低出现错误时资源泄漏的风险。

//延迟执行：defer 可以用于延迟执行函数，有时这对于代码逻辑更加清晰。例如，你可以使用 defer 来记录函数的执行时间，以确保在函数结束时记录。

//反转执行顺序：defer 函数会按照后进先出（LIFO）的顺序执行，这意味着最后一个使用 defer 声明的函数会最先执行，而第一个 defer 声明的函数会最后执行。这可以用于翻转执行顺序，如先进后出的数据结构。

//优雅处理恐慌（Panic）：在 Go 中，恐慌是一种不可恢复的错误。defer 可以用于在发生恐慌时执行清理操作，以确保资源被释放，并提供一种优雅的方式来处理恐慌。

//执行计时：defer 也可以用于记录函数的执行时间，通常与 time 包一起使用，以测量函数的性能
